//接收post请求
//通过ctx.method来判断请求类型
//koa2没有封装获取参数的方法，需要解析ctx.req来获取
/* 
    获取Post请求的步骤
    1. 解析上下文ctx中的原生node.js对象req
    2. 将POST表单数据解析成querystring字符串（例如userName=levy&&age=20）
    3. 将字符串转换成JSON格式
*/
/*
    ctx.request 和 ctx.req的区别
    ctx.request是Koa2中context经过封装的请求对象，更加直观
    ctx.req是context提供的node.js原生HTTP请求对象，可以获取更多内容，适于深度编程
*/
const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
    const url = ctx.url , method = ctx.method;
    console.log(url);
    //get请求是显示表单
    if ( url === '/' && method === 'GET') {
        const html = `
            <h1>Request Post</h1>
            <form method="post" action="/">
                <p>userName</p>
                <input name="userName" /><br/>
                <p>age</p>
                <input name="age" /><br/>
                <p>email</p>
                <input name="email" /><br/>
                <button type="submit">提交</button>
            </form>
        `;
        ctx.body = html;
        //post请求时
    } else if ( url === '/' && method === 'POST') {
        let query = await parsePostDataStr(ctx);
        ctx.body = query;
        //其他请求404
    } else {
        ctx.body = '404 Not Found !';
    }
});

//将post请求的数据转换成字符串（例如userName=levy&&age=20）
function parsePostDataStr (ctx) {
    return new Promise ( (resolve,reject) => {
        try {
            let postData = '';
            //监听逐个获取数据
            ctx.req.addListener('data', data => {
                postData += data;
            });
            //koa on事件监听结束
            ctx.req.on('end', () => {
                let query = parseQueryStr(postData);
                resolve(query);
            });
        } catch (error) {
            reject(error);
        }
    });
}

//将字符串转换成对象
function parseQueryStr (queryStr) {
    let query = {};
    let queryStrList = queryStr.split('&');
    for (let item of queryStrList) {
        let itemList = item.split('=');
        query[itemList[0]] = encodeURIComponent(itemList[1]);
    }
    return query;
}

app.listen(3000, () => {
    console.log('Server is running at port 3000.');
})

